/**
 * 本地存储工具类
 * 提供localStorage的增删改查功能
 */
const storage = {
  /**
   * 设置本地存储
   * @param {string} key - 存储的键名
   * @param {any} value - 存储的值，可以是任意类型
   * @returns {boolean} - 是否设置成功
   */
  set(key, value) {
    try {
      const strValue = typeof value === 'object' ? JSON.stringify(value) : value;
      localStorage.setItem(key, strValue);
      return true;
    } catch (error) {
      console.error('设置本地存储失败:', error);
      return false;
    }
  },

  /**
   * 获取本地存储
   * @param {string} key - 存储的键名
   * @param {any} defaultValue - 默认值，当获取不到时返回
   * @returns {any} - 存储的值
   */
  get(key, defaultValue = null) {
    try {
      const value = localStorage.getItem(key);
      if (value === null) return defaultValue;

      // 尝试解析为JSON对象
      try {
        return JSON.parse(value);
      } catch (error) {
        // 解析失败时返回null
        return null
      }
    } catch (error) {
      console.error('获取本地存储失败:', error);
      return defaultValue;
    }
  },

  /**
   * 删除本地存储
   * @param {string} key - 存储的键名
   * @returns {boolean} - 是否删除成功
   */
  remove(key) {
    try {
      localStorage.removeItem(key);
      return true;
    } catch (error) {
      console.error('删除本地存储失败:', error);
      return false;
    }
  },

  /**
   * 清除所有本地存储
   * @returns {boolean} - 是否清除成功
   */
  clear() {
    try {
      localStorage.clear();
      return true;
    } catch (error) {
      console.error('清除本地存储失败:', error);
      return false;
    }
  },

  /**
   * 判断是否存在某个键
   * @param {string} key - 存储的键名
   * @returns {boolean} - 是否存在
   */
  has(key) {
    try {
      return localStorage.getItem(key) !== null;
    } catch (error) {
      console.error('判断本地存储键是否存在失败:', error);
      return false;
    }
  },

  /**
   * 获取所有键名
   * @returns {string[]} - 所有键名数组
   */
  keys() {
    try {
      const keys = [];
      for (let i = 0; i < localStorage.length; i++) {
        keys.push(localStorage.key(i));
      }
      return keys;
    } catch (error) {
      console.error('获取本地存储所有键名失败:', error);
      return [];
    }
  }
};

export default storage;